#ifndef CHATSERVICE_H
#define CHATSERVICE_H

#include<muduo/net/TcpConnection.h>
#include<unordered_map>
#include<functional>
#include<mutex>

using namespace std;
using namespace muduo;
using namespace muduo::net;

#include"redis.hpp"
#include"UserModel.hpp"
#include"offinemessagemodel.hpp"
#include"friendmodel.hpp"
#include"groupmodel.hpp"

#include  "json.hpp"
using json = nlohmann::json; //起了个更多的名称

//表示处理消息的事件回调方法类型
using MsgHandler = std::function<void (const TcpConnectionPtr &conn,json &js,Timestamp)>;

// 聊天服务器业务类 , 单例模式实现
class ChatService
{
public:
    //获取单例对象的接口函数
    static ChatService* instance();
    //处理 登录的业务
    void login(const TcpConnectionPtr &conn,json &js,Timestamp time);
    //处理注册的业务
    void reg(const TcpConnectionPtr &conn,json &js,Timestamp time);

    //一对一聊天业务
    void oneChat(const TcpConnectionPtr &conn,json &js,Timestamp time);

    // 获取消息对应的处理器
    MsgHandler getHandler(int msgid);

    //客户端异常关闭了
    void clientCloseException(const TcpConnectionPtr &conn);

    //处理注销业务
    void logout(const TcpConnectionPtr &conn,json &js,Timestamp time);
    
    //服务器异常，业务重置方法
    void reset();

    //添加好友业务
    void addFriend(const TcpConnectionPtr &conn,json &js,Timestamp time);

    //创建群组业务
    void createGroup(const TcpConnectionPtr &conn,json &js,Timestamp time);

    //加入群组业务
    void addGroup(const TcpConnectionPtr &conn,json &js,Timestamp time);

    //群组聊天业务
    void groupChat(const TcpConnectionPtr &conn,json &js,Timestamp time);

    //redis 回调
    void handleRedisSubscribeMessage(int userid,string msg);
private:
    ChatService();

    //存储消息id 和其对应的业务处理方法
    unordered_map<int, MsgHandler> _msgHandlerMap;

    // 存储在线用户的通信链接
    unordered_map<int, TcpConnectionPtr> _userConnMap;
    mutex _connMutex; //保证 哈希表的线程安全

    //数据操作类对象
    UserModel _userModel;
    OfflineMsgModel _offlineMsgModel;    //离线数据缓存类
    FriendModel _friendModel;    //好友关系类
    GroupModel _groupModel;    //群组关系类

    //redis对象
    Redis _redis;
};


#endif